const db = require('../db')
const bcryptjs = require('bcryptjs')
const schema = require('../schema')
const {validationUtil, procWhere, procOrder} = require('./util')
const auth = require('../auth')
const captcha = require('../util/captcha')
const {redisCli} = require('../redis')
const Lock = require('../util/lock')

// 添加权限  
exports.authAdd = (req, res) => {
    let obj = req.body
    // 1.检测表单数据是否合法；
    validationUtil(schema.authSchema.authAdd, obj) // 验证失败抛异常，被全局错误处理器处理 
    
    // 2.权限名是否被占用；
    db.Auth.findAll({
        where: {
            name: obj.name,
            level: 1,
        }
    }).then(results => {
        console.log('param obj:', obj) 
        console.log('results', results)
        // 权限名被占用 
        if(results.length > 0) {
            return res.cc('权限名已存在')
        }
        // 4.插入新权限
        db.Auth.create({
            ...obj,
            state: true 
        }).then(result => {
            console.log('insert result', JSON.stringify(result)) 
            // 判断影响行数是否为1
            if(!result || !result.name) return res.cc('添加权限失败，请稍后再试！')
            // 注册成功 
            res.cc('添加权限成功！', 0)
        }).catch(err => {
            console.log(err) 
            res.cc(err)
        })
    }).catch(err => {
        res.cc(err)
    })
    
}

// 更新权限  
exports.authUpdate = (req, res) => {
    let obj = req.body
    // 1.检测表单数据是否合法；
    validationUtil(schema.authSchema.authUpdate, obj) // 验证失败抛异常，被全局错误处理器处理 
    
    // 2.权限名是否被占用；
    db.Auth.findAll({
        where: {
            id: obj.id 
        }
    }).then(results => {
        console.log('results', results)
        // 权限不存在  
        if(!results.length) {
            return res.cc(`权限[id:${obj.id},name:${obj.name}]不存在`)
        }
        // 4.更新权限
        db.Auth.update(obj, {
            where: {
                id: obj.id 
            }
        }).then(result => {
            console.log('update result', JSON.stringify(result)) 
            res.cc('更新成功', 0)
        }).catch(err => {
            res.cc(err)
        })
    }).catch(err => {
        res.cc(err)
    })
    
}

// 更新权限树(开发中...)   
exports.authTreeUpdate = (req, res) => {
    let obj = req.body
    // 1.检测表单数据是否合法；
    validationUtil(schema.authSchema.authTreeUpdate, obj) // 验证失败抛异常，被全局错误处理器处理 
    
    // 2.获取分布式锁 
    let newLock = new Lock('authTreeUpdate.lock')
    newLock.init().then(lock => {
        lock.lock().then(result => {
            console.log('获取锁成功')
            // 更新数据库
            // doAuthTreeUpdate(obj, res).then(result => {
            //     newLock.unlock() 
            // }).catch(error => {
            //     console.log('更新权限树异常:', err)  
            //     newLock.unlock() 
            // })
        }, err => {
            console.error('获取锁失败:', err) 
            res.cc('操作超时，请稍后重试')
        })
    }, err => {
        console.error('redis lock 初始化失败', err)
        res.cc('redis lock 初始化失败')
    })


    return null 
    // 2.权限名是否被占用；
    db.Auth.findAll({
        where: {
            name: obj.name
        }
    }).then(results => {
        console.log('results', results)
        // 权限名被占用 
        if(results.length > 0) {
            return res.cc('权限名已存在')
        }
        // 4.插入新权限
        db.Auth.create({
            ...obj
        }).then(result => {
            console.log('insert result', JSON.stringify(result)) 
            // 判断影响行数是否为1
            if(!result || !result.name) return res.cc('添加权限失败，请稍后再试！')
            // 注册成功 
            res.cc('添加权限成功！', 0)
        }).catch(err => {
            res.cc(err)
        })
    }).catch(err => {
        res.cc(err)
    })
    
}
// async function doAuthTreeUpdate(obj, res) {
//     console.log('doAuthTreeUpdate:', obj) 
//     let chidren1 = obj.children 
//     if(chidren1 && chidren1.length) {
//         chidren1.forEach(item1 => {
//             let id = item1.id 
//             let one = await db.Auth.findByPk(id) 
//         })
//     }
//     // res.cc('aaaa')

// }

// 查询权限列表 
exports.list = (req, res) => {
    let params = req.body
    // 1.检测表单数据是否合法；
    validationUtil(schema.authSchema.authList, params) // 验证失败抛异常，被全局错误处理器处理 
    
    // 2.查询 
    let offset = (params.currentPage-1)*params.pageSize 
    let limit = params.pageSize 
    let where = procWhere(params.where, db.AuthAttributes) 
    let order = procOrder(params.sort)
    let options = {
            offset,
            limit,
            where,
        }
    if(order) options.order = order 
    db.Auth.findAll(options).then(results => {
        // console.log('results: ', results)
        // 查询total 
        db.Auth.findAll({
            attributes: [
                [db.Sequelize.fn('COUNT', db.Sequelize.col('*')), 'cnt']
            ],
            where
        }).then(results2 => {
            let total = JSON.parse(JSON.stringify(results2))[0].cnt  
            res.json({
                status: 0,
                message: 'success',
                data: {results, total}
            })
        }).catch(err => {
            res.cc(err)
        })
    }).catch(err => {
        res.cc(err)
    })
}

// 查询权限树  
exports.tree = async (req, res) => {
    let arr = [] 
    try {
        let options1 = {
                where: { level: 1 }
            }
        let results1 = await db.Auth.findAll(options1)
        // console.log('results1: ', results1)
        for(let i = 0; i < results1.length; i++) {
            let item1 = results1[i] 
            let data1 = item1.dataValues 
            console.log('item1: ', data1) 
            arr.push(data1) 
            data1.children = [] 
            let options2 = {
                where: { level: 2, pid: data1.id }
            }
            let results2 = await db.Auth.findAll(options2)
            results2.forEach(item2 => {
                let data2 = item2.dataValues 
                data1.children.push(data2) 
            })
        }
        res.json({
            status: 0,
            message: 'success',
            data: arr 
        })
    } catch(err) {
        res.cc(err) 
    }
    

    // 查询total 
    // db.Auth.findAll({
    //     where: {
    //         level: 2
    //     }
    // }).then(results2 => {
    //     let total = JSON.parse(JSON.stringify(results2))[0].cnt  
    //     res.json({
    //         status: 0,
    //         message: 'success',
    //         data: {results, total}
    //     })
    // }).catch(err => {
    //     res.cc(err)
    // })
    
}

// 删除角色   
exports.delete = (req, res) => {
    let params = req.body
    console.log('params', params)
    // 1.检测表单数据是否合法；
    validationUtil(schema.authSchema.authDelete, params) // 验证失败抛异常，被全局错误处理器处理 
    if(!params.ids.length) return res.cc('参数ids为空,无需删除', 0)
    
    // 2.查询 
    db.Auth.destroy({
        where: {
            id: params.ids
        }
    }).then(results => {
        console.log('results', results)
        res.json({
            status: 0,
            message: 'success',
            data: results
        })
    }).catch(err => {
        res.cc(err)
    })
    
}

